package Classes_Conexao;
// importa pacotes e componentes necessarios para rodar recursos do java
import Classes.Usuario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class UsuarioDAO {
    // instanciando um atributo da classe UsuarioDAO.

    private Connection connection;

    public UsuarioDAO() throws SQLException {
        this.connection = Conexao.getConnection();
    }

    // busca os registro da tabela de usuario que verifica se a senha o login são compativeis.
    public ArrayList<Usuario> busca(Usuario registro) throws SQLException {
        PreparedStatement comando;
        ArrayList<Usuario> resultado = new ArrayList<Usuario>();
        ResultSet rs;


        try {
            // consulta sql que pega login e senha da tabelas usuarios.
            String sql = ("select login,senha from usuarios where login =? and senha =?");
            comando = connection.prepareStatement(sql);
            comando.setString(1, registro.getLogin());
            comando.setString(2, registro.getSenha());
            // executa o comando.
            comando.execute();
            rs = comando.getResultSet();

            while (rs.next()) {
                Usuario temp = new Usuario();
                temp.setLogin(rs.getString("login"));
                temp.setSenha(rs.getString("senha"));
                // adiciona os valores da variavel temp
                resultado.add(temp);
            }
            // fecha o comando
            comando.close();
            // retorna o resultado
            return resultado;
            // instancia de erro
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Erro ao buscar");
            return null;
        }
    }
    // insere um registro no banco de dados
    public void adiciona(Usuario usuario) throws SQLException {
        // consulta que insere na tabela usuarios os valores de nome, login e senha.
        String sql = "insert into usuarios (nome, login, senha) values (?,?,?)";
        PreparedStatement stmt = connection.prepareStatement(sql);
        stmt.setString(1, usuario.getNome());
        stmt.setString(2, usuario.getLogin());
        stmt.setString(3, usuario.getSenha());
        // executa e fecha a instancia.
        stmt.execute();
        stmt.close();
    }
    // retorna todos os usuarios para a tabela no banco de dados
    public ArrayList<Usuario> retornaTodosUsuarios() {
        PreparedStatement comando;
        ArrayList<Usuario> listaUsuario = new ArrayList<Usuario>();

        try {
            // consulta que retorna todos da tabela usuarios.
            String sql = "SELECT * FROM usuarios";
            comando = connection.prepareStatement(sql);
            ResultSet rs = comando.executeQuery(sql); //ExecuteQuery é associado as operações de insert,delete,update.

            while (rs.next()) {
                Usuario usuario = new Usuario();
                usuario.setCodigo(rs.getInt("codigo"));
                usuario.setNome(rs.getString("nome"));
                usuario.setLogin(rs.getString("login"));
                // adiciona os valores da listaUsuario.
                listaUsuario.add(usuario);
            }
            // fecha a instancia
            comando.close();
            // retorna listaUsuario
            return listaUsuario;
            // instancia de erros
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
    // metodo para excluir uma instancia no banco de dados
    public void excluir(Usuario usuario) {
        PreparedStatement comando;
        try {
            // consulta que deleta um registro da tabela usuario apartir do nome passado.
            String sql = "DELETE FROM usuarios WHERE nome=?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, usuario.getNome());
            // executa e finaliza a instancia.
            comando.execute();
            comando.close();
            // comando de erros.
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    // metodo para retorna todos os registros pelo nome.
    public ArrayList<Usuario> retornaUsuarioPorNome(String nome) {
        PreparedStatement comando;
        ArrayList<Usuario> listaUsuario = new ArrayList<Usuario>();

        try {
            // consulta SQL que retorna todos da tabela usuarios que tem nome.
            String sql = "SELECT * FROM usuarios WHERE nome LIKE ?";
            comando = connection.prepareStatement(sql);
            comando.setString(1, nome + "%");
            ResultSet rs = comando.executeQuery(); //ExecuteQuery associado as operações de insert,delete,update.

            while (rs.next()) {
                Usuario usuario = new Usuario();
                usuario.setCodigo(rs.getInt("codigo"));
                usuario.setNome(rs.getString("nome"));
                usuario.setLogin(rs.getString("login"));
                listaUsuario.add(usuario);
            }
            // fecha o comando
            comando.close();
            // retorna lista de usuarios
            return listaUsuario;
            // comando de tratamento de erros.
        } catch (SQLException sqle) {
            sqle.printStackTrace();
            return null;
        }

    }
    // metodo que atualiza um registro na tabela.
    public void editar(Usuario usuario) {
        PreparedStatement comando;
        try {
            // consulta que atualiza os registro da tabela usuarios pelo codigo.
            String sql = "UPDATE usuarios SET nome = ?, login = ? WHERE codigo = ?;";

            comando = connection.prepareStatement(sql);
            comando.setString(1, usuario.getNome());
            comando.setString(2, usuario.getLogin());
            comando.setString(3, Integer.toString(usuario.getCodigo()));
            // executa o comando de atualização.
            comando.executeUpdate();
            // fecha o comando.
            comando.close();
            // comando de tratamento de erros.
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
        // verifica o registro para saber se ja existe algum Login igual ao passado no campo de texto.
    public ArrayList<Usuario> buscaLogin(Usuario registro) throws SQLException {
        PreparedStatement comando;
        ArrayList<Usuario> resultado = new ArrayList<Usuario>();
        ResultSet rs = null;
        try {
            // consulta SQL que pega o login da tabela usuarios.
            String sql = ("select login from usuarios where login =?");

            comando = connection.prepareStatement(sql);
            comando.setString(1, registro.getLogin());
            // executa o comando
            comando.execute();
            rs = comando.getResultSet();

            while (rs.next()) {
                Usuario temp = new Usuario();
                temp.setLogin(rs.getString("login"));
                // adiciona o resultado na variavel temp
                resultado.add(temp);
            }
            // fecha o comando
            comando.close();
            // retorna o resultado.
            return resultado;
            // comando de tratamento de erros
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Erro ao buscar");
            return null;
        }
    }
}
